﻿using System.Collections.Generic;
using CTS.Com.Domain.Exceptions;
using CTS.Com.Domain.Helper;
using CTS.Com.Domain.Model;
using CTS.Data.Domain.Constants;
using CTS.Data.Domain.Entity;
using CTS.Data.MACodes.Domain.Dao;

namespace CTS.Data.MACodes.Domain.Utils
{
    /// <summary>
    /// CodeCom
    /// </summary>
    public class CodeCom
    {
        private readonly CodeComDao _comDao;
        public CodeCom() { _comDao = new CodeComDao(); }

        /// <summary>
        /// Kiểm tra tồn tại code
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="codeGroupCd">Mã nhóm code</param>
        /// <param name="codeCd">Mã code</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>True/False</returns>
        public bool IsExist(string localeCd, string codeGroupCd, string codeCd, bool ignoreDeleteFlag)
        {
            // Trả về true trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(codeGroupCd)
                || DataCheckHelper.IsNull(codeCd)) {
                return true;
            }
            // Kết quả trả về
            return _comDao.IsExist(localeCd, codeGroupCd, codeCd, ignoreDeleteFlag); ;
        }

        /// <summary>
        /// Lấy thông tin code
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="codeGroupCd">Mã nhóm code</param>
        /// <param name="codeCd">Mã code</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Thông tin code</returns>
        public CodeInfo GetInfo(string localeCd, string codeGroupCd, string codeCd, bool ignoreDeleteFlag)
        {
            // Trả về null trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(codeGroupCd)
                || DataCheckHelper.IsNull(codeCd)) {
                return null;
            }
            // Lấy thông tin
            var dataInfo = _comDao.GetInfo(localeCd, codeGroupCd, codeCd, ignoreDeleteFlag);
            // Kết quả trả về
            return DataHelper.CopyObject<CodeInfo>(dataInfo);
        }

        /// <summary>
        /// Lấy tên code
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="codeGroupCd">Mã nhóm code</param>
        /// <param name="codeCd">Mã code</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Tên code</returns>
        public string GetName(string localeCd, string codeGroupCd, string codeCd, bool ignoreDeleteFlag)
        {
            // Trả về blank trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(codeGroupCd)
                || DataCheckHelper.IsNull(codeCd)) {
                return string.Empty;
            }
            // Kết quả trả về
            return _comDao.GetName(localeCd, codeGroupCd, codeCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy nội dung code
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="codeGroupCd">Mã nhóm code</param>
        /// <param name="codeCd">Mã code</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Nội dung code</returns>
        public string GetContent(string localeCd, string codeGroupCd, string codeCd, bool ignoreDeleteFlag)
        {
            // Trả về blank trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(codeGroupCd)
                || DataCheckHelper.IsNull(codeCd)) {
                return string.Empty;
            }
            // Kết quả trả về
            return _comDao.GetContent(localeCd, codeGroupCd, codeCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy danh sách code theo nhóm
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="codeGroupCd">Mã nhóm code</param>
        /// <param name="skipCode">Skip code</param>
        /// <param name="nullValue">Thêm vào giá trị blank</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách code</returns>
        public IList<KeyValueObject> GetDiv(string localeCd, string codeGroupCd, string skipCode, bool nullValue, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var skipCodes = new string[0];
            var listResult = new List<KeyValueObject>();
            // Kết thúc lỗi trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(codeGroupCd)) {
                throw new ParamInvalidException();
            }
            // Lấy danh sách skip code trong trường hợp skip code khác null
            if (skipCode != null) {
                skipCodes = skipCode.Split(DataLogics.DELIMITER_SKIP_CODE);
            }
            // Tạo giá trị trắng trong trường hợp có thêm giá trị trắng
            if (nullValue) {
                listResult.Add(new KeyValueObject());
            }
            // Lấy danh sách code theo nhóm
            var listData = _comDao.GetDiv(localeCd, codeGroupCd, skipCodes, ignoreDeleteFlag);
            // Thêm danh sách code vào danh sách kết quả
            listResult.AddRange(listData);
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy skip code
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="codeCd">Mã code</param>
        /// <returns>Skip code</returns>
        public string GetSkipCode(string localeCd, string codeCd)
        {
            // Kết quả trả về
            return GetName(localeCd, DataLogics.GRPCD_SKIP_CODE, codeCd, false);
        }

        /// <summary>
        /// Lấy tên cờ xóa
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="deleteFlag">Cờ xóa</param>
        /// <returns>Tên cờ xóa</returns>
        public string GetDeleteFlagName(string localeCd, bool? deleteFlag)
        {
            // Lấy chuỗi mã cờ xóa
            var strDeleteFlag = DataHelper.ToString(deleteFlag);
            // Kết quả trả về
            return GetName(localeCd, DataLogics.GRPCD_DELETE_FLAG, strDeleteFlag, true);
        }
    }
}